package ar.edu.utn.frsf.tpae.a2013.g03.presentacion.controller.supervisor;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.SessionScoped;
import javax.faces.context.FacesContext;

import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.CentroCosto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Empleado;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Gasto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.SolicitudGasto;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.model.Supervisor;
import ar.edu.utn.frsf.tpae.a2013.g03.persistencia.utilities.Constantes;
import ar.edu.utn.frsf.tpae.a2013.g03.service.SupervisorService;

@ManagedBean(name="supervisorBean")
@SessionScoped
public class SupervisorBean{
	
		@ManagedProperty(value="#{supervisorService}")
        SupervisorService supervisorService;   
		                       
        private Supervisor supervisor;
        private List<SolicitudGasto> solicitudesPendientes;
        private SolicitudGasto solicitudGasto;
        private List<CentroCosto> listaCentrosCosto;
    	private Integer idCentroCosto;
    	private List<Empleado> listaEmpleados;
    	private Integer idEmpleado;
        private List<Gasto> listaGastos;
        private String user;
        private String pass;
       
        @PostConstruct
        public void init() {            
    	
        }
        
//		public String iniciarSesion() {
//			try{
//				supervisor = supervisorService.iniciarSesion(user, pass);
//				if (supervisor != null){
//					FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("supervisor", supervisor);
//					return "aMenuSupervisor";
//				}
//			}catch (Exception e){
//				e.printStackTrace();
//				user="";
//				pass="";
//			}
//			return "aLoginFallidoSupervisor";
//		}
        
		public String cargarSolicitudes() {
			supervisor = (Supervisor) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("supervisor");
			cargarListados();
			return "aSolicitudesSupervisor";
		}
		
		private void cargarListados() {
        	solicitudGasto = new SolicitudGasto();
        	solicitudesPendientes = new ArrayList<SolicitudGasto>();
        	solicitudesPendientes =	supervisorService.listarSolicitudes(Constantes.PENDIENTE);
		}
        
        public String aAprobarSolicitud() {
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("solicitud", solicitudGasto);
            return "aAprobarSolicitud";
        }
        
        public String aRechazarSolicitud(){
            FacesContext.getCurrentInstance().getExternalContext().getSessionMap().put("solicitud", solicitudGasto);
            return "aRechazarSolicitud";
        } 
        
        public String aprobarSolicitud() {
        	solicitudGasto = (SolicitudGasto) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("solicitud");
        	supervisor = (Supervisor) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("supervisor");
        	
        	solicitudGasto.setSupervisor(supervisor);
        	solicitudGasto.setFechaAprobacion(Calendar.getInstance());
        	supervisorService.aprobarSolicitud(solicitudGasto);
        	cargarListados();
        	return "aSolicitudesSupervisor";
        }
        
        public String rechazarSolicitud() {
        	solicitudGasto = (SolicitudGasto) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("solicitud");
        	supervisor = (Supervisor) FacesContext.getCurrentInstance().getExternalContext().getSessionMap().get("supervisor");
        	solicitudGasto.setSupervisor(supervisor);
        	solicitudGasto.setFechaAprobacion(Calendar.getInstance());
        	supervisorService.rechazarSolicitud(solicitudGasto);
        	cargarListados();
        	return "aSolicitudesSupervisor";
        }
        
        public String cargarConsultarGastos(){
        	cargarCentrosCosto();
        	cargarEmpleados();
        	listaGastos = new ArrayList<Gasto>();
        	idCentroCosto = idEmpleado = new Integer(-1);
        	buscarGastos();
         	return "aConsultarGastos";
        }
        
        public void cargarCentrosCosto(){
			listaCentrosCosto = new ArrayList<CentroCosto>(); 
        	listaCentrosCosto.addAll(supervisorService.listarCentrosCosto());
		}
        
        public void cargarEmpleados(){
        	listaEmpleados = new ArrayList<Empleado>();
        	List<Empleado> empleados = supervisorService.listarEmpleados();
        	listaEmpleados.addAll(empleados);
        }
        
        public void buscarGastos() {
        	listaGastos = supervisorService.consultarGastos(getCentroCosto(idCentroCosto), getEmpleado(idEmpleado));
        }
        
    	private CentroCosto getCentroCosto(Integer idCentroCosto) {
    		for (int i = 0; i < listaCentrosCosto.size(); i++) {
				if(listaCentrosCosto.get(i).getIdCentroCosto().equals(idCentroCosto))
					return listaCentrosCosto.get(i);
			}
    		return null;
		}
    	
    	private Empleado getEmpleado(Integer idEmpleado) {
    		for (int i = 0; i < listaEmpleados.size(); i++) {
				if(listaEmpleados.get(i).getIdUsuario().equals(idEmpleado))
					return listaEmpleados.get(i);
			}
    		return null;
		}
        
		public SupervisorService getSupervisorService() {
			return supervisorService;
		}

		public void setSupervisorService(SupervisorService supervisorService) {
			this.supervisorService = supervisorService;
		}

		public List<SolicitudGasto> getSolicitudesPendientes() {
			return solicitudesPendientes;
		}

		public void setSolicitudesPendientes(List<SolicitudGasto> solicitudesPendientes) {
			this.solicitudesPendientes = solicitudesPendientes;
		}

		public SolicitudGasto getSolicitudGasto() {
			return solicitudGasto;
		}

		public void setSolicitudGasto(SolicitudGasto solicitudGasto) {
			this.solicitudGasto = solicitudGasto;
		}

		public List<CentroCosto> getListaCentrosCosto() {
			return listaCentrosCosto;
		}

		public void setListaCentrosCosto(List<CentroCosto> listaCentrosCosto) {
			this.listaCentrosCosto = listaCentrosCosto;
		}

		public Integer getIdCentroCosto() {
			return idCentroCosto;
		}

		public void setIdCentroCosto(Integer idCentroCosto) {
			this.idCentroCosto = idCentroCosto;
		}

		public List<Empleado> getListaEmpleados() {
			return listaEmpleados;
		}

		public void setListaEmpleados(List<Empleado> listaEmpleados) {
			this.listaEmpleados = listaEmpleados;
		}

		public Integer getIdEmpleado() {
			return idEmpleado;
		}

		public void setIdEmpleado(Integer idEmpleado) {
			this.idEmpleado = idEmpleado;
		}

		public List<Gasto> getListaGastos() {
			return listaGastos;
		}

		public void setListaGastos(List<Gasto> listaGastos) {
			this.listaGastos = listaGastos;
		}
        

		public String getUser() {
			return user;
		}

		public void setUser(String user) {
			this.user = user;
		}

		public String getPass() {
			return pass;
		}

		public void setPass(String pass) {
			this.pass = pass;
		}

}
